package com.asen.libcommon.config

import android.app.Application
import android.graphics.Color
import androidx.multidex.MultiDex
import com.alibaba.android.arouter.launcher.ARouter
import com.asen.libcommon.BuildConfig
import com.asen.libcommon.base.BaseApplication
import com.asen.libcommon.base.IBaseModule
import com.asen.libcommon.exception.CrashHandler
import com.asen.libcommon.util.LogUtil
import com.asen.libcommon.util.SPUtil
import com.asen.libcommon.util.BuglyManage
import com.google.gson.Gson
import com.lxj.xpopup.XPopup
import com.orhanobut.logger.Logger
//import com.thejoyrun.aptpreferences.AptParser
//import com.thejoyrun.aptpreferences.AptPreferencesManager
import com.ycbjie.webviewlib.X5WebUtils
import com.zchu.rxcache.RxCache
import com.zchu.rxcache.diskconverter.GsonDiskConverter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import me.jessyan.autosize.AutoSize
import java.lang.reflect.Type


/**
 * @date   : 2020/12/4
 * @author : asenLiang
 * @e-mail : liangAisiSen@163.com
 * @desc   : 公用配置 - 静态封装
 */
object BaseConfig {

    val isDebug = BuildConfig.DEBUG // 项目是否是 debug 模式

    val sqlName = "asen" // 数据库名字

    private var application: Application = BaseApplication.application

    /** 在 application 上面初始化 */
    fun initApplication() {
        // todo：通过线程初始化
        GlobalScope.launch(Dispatchers.Default) {
            //解决65536方法数
            MultiDex.install(application)
            // 全程捕获异常信息
            CrashHandler().init(application, "asenLiang" + "/error")
            // 初始化弹窗
            initXPopup()
            // X5WebUtils x5内核
            X5WebUtils.init(application)
        }
        // todo：主线程初始化
        //路由初始化m
        initRouter()
        // 各模块初始化application配置,以后直接到模块下的ModuleInit配置环境就行,不需要再base基类配置，解耦分离
        initModuleApplication()
        //今日头条适配
        AutoSize.initCompatMultiProcess(application)
        //SharePreferences框架
        initAptPreferences()
        // 初始化SP存储
        SPUtil.init(application)
    }

    /** 在 activity 上面初始化，需要统一隐私政策后才能执行 */
    fun initActivity() {
        // todo：通过线程初始化
        GlobalScope.launch(Dispatchers.Default) {
            //Bugly初始化
            BuglyManage.initBugly(application)
            // 初始化日志
            LogUtil.initLogger()
            // 初始化缓存
            initRxCache()
            // 友盟分享

            // 极光推送

            // 环信IM
        }
        // todo：主线程初始化
    }

    /** 路由初始化 */
    private fun initRouter() {
        if (isDebug) {
            ARouter.openLog()
            ARouter.openDebug()
        }
        ARouter.init(application)
    }

    /** 初始化缓存 */
    private fun initRxCache() {
        RxCache.initializeDefault(
            RxCache.Builder()
                .appVersion(1)
                // .diskDir(File(context?.cacheDir?.path + File.separator + "data-cache"))
                .diskConverter(GsonDiskConverter())
                .diskMax((20 * 1024 * 1024).toLong())
                .memoryMax(0)
                .setDebug(true)
                .build()
        )
    }

    /** 初始化弹窗 */
    private fun initXPopup() {
        XPopup.setPrimaryColor(Color.parseColor("#00B2FF"))
    }

    /**
     * 初始化AptPreferences，
     */
    private fun initAptPreferences() {
//        val gson = Gson()
//        AptPreferencesManager.init(application, object : AptParser {
//            override fun deserialize(type: Type?, text: String?): Any? {
//                return gson.fromJson(text, type)
//            }
//
//            override fun serialize(`object`: Any?): String? {
//                return gson.toJson(`object`)
//            }
//        })
    }

    /** 反射遍历各模块的application 仿照测试模块 */
    private fun initModuleApplication() {
        for (moduleInitName
        in arrayOf(
            "com.asen.test.Application", // 测试模块     // 已添加
            "com.asen.app.Application",  // 基本模块     // 已添加
            "com.asen.main.Application", // 主业务模块   // 未添加
            "com.asen.logo.Application", // 登录验证模块 // 未添加
            "com.asen.home.Application", // 首页业务模块 // 未添加
            "com.asen.work.Application", // 工作业务模块 // 未添加
            "com.asen.msg.Application",  // 消息业务模块 // 未添加
            "com.asen.user.Application"  // 用户业务模块 // 未添加
        )) {
            try {
                val clazz = Class.forName(moduleInitName)
                val init: IBaseModule = clazz.newInstance() as IBaseModule
                Logger.e("初始化模块：$moduleInitName")
                // 调用初始化方法
                init.onInit(application)
            } catch (e: ClassNotFoundException) {
                Logger.e(e.message ?: "")
                e.printStackTrace()
            } catch (e: InstantiationException) {
                Logger.e(e.message ?: "")
                e.printStackTrace()
            } catch (e: IllegalAccessException) {
                Logger.e(e.message ?: "")
                e.printStackTrace()
            }
        }
    }

}